#ifndef __UDS_H
#define __UDS_H
#ifdef _cplusplus
extern "C" {
#endif

#include "uds_fp.h"

#include "cJSON_ext.h"
#include "cJSON.h"
#include "md_thread.h"
/*
    回调函数类型定义( cSJON传参皆有外部释放！！！)
    参数说明：res 帧解析结果
            cJSON *mess_in: uds接收到的请求或者请求应答
            cJSON *messout：需要发出的应答（如果本身就是接收应答则为NULL）
            
*/
typedef int (*listen_callback_func)(res_type_e res, cJSON *mess_in, cJSON *mess_ack);   
typedef int (*tx_callback_func)(res_type_e res, cJSON *mess_in);   

typedef struct	_t_uds_handle_arg{
	t_thread_mutex mutex;		//互斥锁
	char    *local_sock_name;     //本地.sock 文件名称(绝对路径)
    int sock_fd;
	uint64_t send_id;			//发送消息id
    t_uds_fp_tx uds_fp_tx_list;                //uds通信发链表 头节点为无效数据
    t_uds_fp_listen uds_fp_listen_list;            //uds通信监听链表 头节点为无效数据
}t_uds_handle_arg,*pt_uds_handle_arg;


int uds_init(pt_uds_handle_arg p_handle);
int uds_task(pt_uds_handle_arg p_handle);
//发送消息通知或者请求，需要应答
int uds_topic_notify_ex(pt_uds_handle_arg p_handle, cJSON *notify, tx_callback_func cb, uint32_t outtime );

//uds_topic_ack_ex 只能在发送回调函数或者监听注册回调函数内部调用
int uds_topic_ack_ex(pt_uds_handle_arg p_handle, cJSON *ack);

int uds_topic_listen_ex(pt_uds_handle_arg p_handle,char *topic, char *src, listen_callback_func cb);
int uds_topic_unlisten_ex(pt_uds_handle_arg p_handle,char *topic, char *src);


#ifdef _cplusplus
}
#endif
#endif
